package br.com.zorandir.pesquisa;

import java.util.ArrayList;
import java.util.Iterator;

import org.neo4j.cypher.javacompat.ExecutionEngine;
import org.neo4j.cypher.javacompat.ExecutionResult;
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.Node;
import org.neo4j.kernel.EmbeddedGraphDatabase;

import br.com.zorandir.bean.Produto;

public class ProdutosDao {

	public static void main(String[] args) {
		GraphDatabaseService db = criaDatabase();
		
		String query = "start origem=node(8) " +
				"MATCH origem<-[:COMPROU]-(pessoa)-[:COMPROU]->produtos-[:DENTRO_DE]->categoria, origem-[:DENTRO_DE]->categoriaOrigem " +
				"WHERE not(produtos--categoriaOrigem) " +
				"return (DISTINCT produtos), categoria";
		
		ExecutionEngine engine = new ExecutionEngine(db);
		ExecutionResult result = engine.execute(query);
		System.out.println(result);

//		Iterator<Node> produtos = result.columnAs("produtos");
//		while (produtos.hasNext()) {
//			Node produto = produtos.next();
//		}

	}

	public ArrayList<Produto> listSugestoesProdutos(int i){
		GraphDatabaseService db = criaDatabase();
		//Nó 2 (Ricardo), comprou mais qual celular?
		String query = "start origem=node(" + i +") " +
				"MATCH origem<-[:COMPROU]-(pessoa)-[:COMPROU]->produtos-[:DENTRO_DE]->categoria, origem-[:DENTRO_DE]->categoriaOrigem " +
				"WHERE not(produtos--categoriaOrigem) " +
				"return DISTINCT produtos, categoria";
		
		ExecutionEngine engine = new ExecutionEngine(db);
		ExecutionResult result = engine.execute(query);
		System.out.println(result);

		Iterator<Node> produtos = result.columnAs("produtos");
		ArrayList<Produto> listaProdutos = new ArrayList<Produto>();

		while (produtos.hasNext()) {
			Node produtoNode = produtos.next();
			Produto produto = new Produto();
			produto.setId(produtoNode.getId());
			produto.setNome(produtoNode.getProperty("nome") + "");
			produto.setTipo(produtoNode.getProperty("tipo") + "");
			listaProdutos.add(produto);
		}
		db.shutdown();

		return listaProdutos;
	}

	public ArrayList<Produto> listProdutos(){
		GraphDatabaseService db = criaDatabase();
		//Nó 2 (Ricardo), comprou mais qual celular?
		String query = "start n=node(*) match n<-[:DENTRO_DE]-(produtos) return produtos";
		
		ExecutionEngine engine = new ExecutionEngine(db);
		ExecutionResult result = engine.execute(query);
		System.out.println(result);

		Iterator<Node> produtos = result.columnAs("produtos");
		ArrayList<Produto> listaProdutos = new ArrayList<Produto>();

		while (produtos.hasNext()) {
			Node produtoNode = produtos.next();
			Produto produto = new Produto();
			produto.setId(produtoNode.getId());
			produto.setNome(produtoNode.getProperty("nome") + "");
			produto.setTipo(produtoNode.getProperty("tipo") + "");
			listaProdutos.add(produto);
		}
		db.shutdown();
		return listaProdutos;
	}

	public ExecutionResult listRelacionamentos(){
		GraphDatabaseService db = criaDatabase();
		//Nó 2 (Ricardo), comprou mais qual celular?
		String query = "start origem=node(*) match origem-[relacionamento]-destino return origem, relacionamento, destino";
		
		ExecutionEngine engine = new ExecutionEngine(db);
		ExecutionResult result = engine.execute(query);
		System.out.println(result);

		return result;
	}

	private static GraphDatabaseService criaDatabase() {
		final EmbeddedGraphDatabase db = new EmbeddedGraphDatabase("database");
		Runtime.getRuntime().addShutdownHook(new Thread() {
			@Override
			public void run() {
				db.shutdown();
			}
		});
		return db;
	}
}
